home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / ADDON.PAK / PDWIN.CPP < prev    next >
Text File  |  1997-05-06  |  8KB  |  283 lines

  1. /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2.  
  3.   pdwin.cpp
  4.   Created: 12/1/95
  5.   Copyright (c) 1995, Borland International
  6.   $Revision:   1.16  $
  7.  
  8. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
  9. #ifndef __AOEXPCH_H
  10.   #include "aoexpch.h"
  11. #endif
  12. #pragma hdrstop
  13.  
  14. #include <commctrl.h>
  15. #include <ideaddon\iview.h>
  16. #include <ideaddon\iide.h>
  17. #include "pdwin.h"
  18. #include "tests.hrc"
  19.  
  20. ProjectDetailView::ProjectDetailView(HWND hwnd) {
  21.  
  22.   d_projectServer = GET_INTERFACE(IProjectServer);
  23.   d_makeServer = GET_INTERFACE(IMakeServer);
  24.   d_targetServer = GET_INTERFACE(ITargetServer);
  25.   d_hwnd = hwnd;
  26. };
  27.  
  28. ProjectDetailView::~ProjectDetailView() {
  29.   d_projectServer->Release();
  30.   d_makeServer->Release();
  31.   d_targetServer->Release();
  32. };
  33.  
  34. void ProjectDetailView::CreateList() {
  35.  
  36.   RECT rcl;          // rectangle for setting the size of the window
  37.   GetClientRect(d_hwnd, &rcl);
  38.  
  39.   d_hwndList = CreateWindowEx(WS_EX_NOPARENTNOTIFY,
  40.                             WC_LISTVIEW,                // list view class
  41.                             "",                        // no default text
  42.                             WS_VISIBLE | WS_CHILD | WS_BORDER
  43.                             | LVS_REPORT |WS_EX_CLIENTEDGE,
  44.                             0, 0,
  45.                             rcl.right - rcl.left, rcl.bottom - rcl.top,
  46.                             d_hwnd,
  47.                             (HMENU)1,
  48.                             NULL,
  49.                             NULL );
  50.   InitColumns();
  51. };
  52.  
  53. void ProjectDetailView::Resize(int w, int h) {
  54.   MoveWindow(d_hwndList, 0, 0, w, h, TRUE);
  55. }
  56.  
  57. static char* headers[] = {
  58.                            "Name",
  59.                            "Type",
  60.                            "Description",
  61.                            "Input Location",
  62.                            "Input Age",
  63.                            "Output Location",
  64.                            "Output Age",
  65.                            "Target",
  66.                           };
  67.  
  68. #define NCOLUMNS sizeof(headers)/sizeof(headers[0])
  69.  
  70. void ProjectDetailView::InitColumns() {
  71.   // Now initialize the columns we will need
  72.   // Initialize the LV_COLUMN structure
  73.   // the mask specifies that the .fmt, .ex, width, and .subitem members 
  74.   // of the structure are valid,
  75.   LV_COLUMN lvC;      // List View Column structure
  76.   lvC.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
  77.   lvC.fmt = LVCFMT_LEFT;  // left align the column
  78.   lvC.cx = 75;            // width of the column, in pixels
  79.  
  80.   // Add the columns.
  81.   int index;          // Index used in for loops
  82.   for ( index = 0; index < NCOLUMNS; ++index ) {
  83.    lvC.iSubItem = index;
  84.    lvC.pszText = headers[index];
  85.    if (ListView_InsertColumn(d_hwndList, index, &lvC) == -1)
  86.      return;
  87.   };
  88. }
  89.  
  90. void ProjectDetailView::ShowNodes(ProjectNode* nodes, int numNodes) {
  91.   unsigned i;
  92.   for ( i = 0; i < numNodes; ++i ) {
  93.     ShowNode(nodes[i]);
  94.   }
  95. };
  96.  
  97. void ProjectDetailView::ShowSelectedNodes() {
  98.   int numNodes;
  99.   ProjectNode * nodes = d_projectServer->QuerySelectedNodes( &numNodes );
  100.   ShowNodes(nodes, numNodes);
  101. }
  102.  
  103.  
  104. void ProjectDetailView::ShowNode(ProjectNode node) {
  105.  
  106.   IProjectNodeInfo* pni = d_projectServer->QueryNodeInfo( node );
  107.   if (!pni)
  108.    return;
  109.  
  110.   long inputAge;
  111.   long outputAge;
  112.  
  113.   if (d_makeServer) {
  114.     inputAge = d_makeServer->NodeInputAge( node );
  115.     outputAge = d_makeServer->NodeOutputAge( node );
  116.   } else {
  117.     inputAge = 0;
  118.     outputAge = 0;
  119.   }
  120.   char items[20][256];
  121.   int i = 0;
  122.  
  123.   IPolyString* name = pni->GetName();
  124.   if (name) {
  125.     strcpy(items[i++], name->GetCstr());
  126.     name->Release();
  127.   }
  128.   IPolyString* nodeType = pni->GetNodeType();
  129.   if (nodeType) {
  130.     strcpy(items[i++], nodeType->GetCstr());
  131.     nodeType->Release();
  132.   }
  133.   IPolyString* nodeDesc = pni->GetDescription();
  134.   if (nodeDesc) {
  135.     strcpy(items[i++], nodeDesc->GetCstr());
  136.     nodeDesc->Release();
  137.   }
  138.   IPolyString* nodeInput = pni->GetInputLocation();
  139.   if (nodeInput) {
  140.     strcpy(items[i++], nodeInput->GetCstr());
  141.     nodeInput->Release();
  142.   }
  143.  
  144.   wsprintf(items[i++], "0x%x", inputAge);
  145.  
  146.   IPolyString* nodeOutput = pni->GetOutputLocation();
  147.   if (nodeOutput) {
  148.     strcpy(items[i++], nodeOutput->GetCstr());
  149.     nodeOutput->Release();
  150.   }
  151.  
  152.   wsprintf(items[i++], "0x%x", outputAge);
  153.   pni->Release();
  154.  
  155.   if ( d_targetServer->NodeIsTarget(node) ) {
  156.     strcpy(items[i++], "Yes");
  157.   } else {
  158.     strcpy(items[i++], "No");
  159.   }
  160.  
  161.  
  162.   //
  163.   // insert text into the list here
  164.   //
  165.   LV_ITEM lvI;        // List view item structure
  166.   lvI.mask = LVIF_TEXT | LVIF_STATE;
  167.   lvI.state = 0;      //
  168.   lvI.stateMask = 0;  //
  169.  
  170.  
  171.   int index = ListView_GetItemCount(d_hwndList);
  172.   lvI.iItem = index;
  173.   lvI.iSubItem = 0;
  174.   lvI.pszText = items[0]; 
  175.   lvI.cchTextMax = strlen(items[0])+1;
  176.  
  177.   if (ListView_InsertItem(d_hwndList, &lvI) == -1)
  178.     return;
  179.  
  180.   int iSubItem;      // Index for inserting sub items
  181.   for (iSubItem = 1; iSubItem < NCOLUMNS; iSubItem++) {
  182.     ListView_SetItemText( d_hwndList,
  183.                           index,
  184.                           iSubItem,
  185.                           items[iSubItem]);
  186.   }
  187. };
  188.  
  189.  
  190. LONG APIENTRY ProjectDetailViewWndProc(
  191.   HWND hWnd,                /* window handle                   */
  192.   UINT message,            /* type of message                */
  193.   UINT wParam,              /* additional information         */
  194.   LONG lParam)              /* additional information         */
  195. {
  196.   ProjectDetailView* mv = GetProjectDetailViewFromHWND(hWnd);
  197.   switch (message)
  198.   {
  199.  
  200.     case WM_CREATE:
  201.     {
  202.       // Create the tree view window and initialize its
  203.       // image list
  204.       mv = new ProjectDetailView(hWnd);
  205.       SetWindowLong(hWnd, GWL_USERDATA, (long)mv);
  206.       mv->CreateList();
  207.    }
  208.       break;          
  209.     case WM_SIZE:
  210.     {
  211.       mv->Resize(LOWORD(lParam), HIWORD(lParam));
  212.     }
  213.       break;
  214.     case WM_DESTROY:
  215.     {
  216.       delete mv;
  217.       SetWindowLong(hWnd, GWL_USERDATA, 0L);
  218.     }
  219.     default:
  220.       return (DefWindowProc(hWnd, message, wParam, lParam));
  221.   }
  222.   return (0);
  223. }
  224.  
  225. BOOL RegisterProjectDetailViewClass(HINSTANCE hInstance)       /* current instance             */
  226. {
  227.   WNDCLASS  wcProjectDetailView;
  228.  
  229.  
  230.   if ( GetClassInfo(hInstance,              // handle of application instance
  231.                     TEXT("ProjectDetailViewWClass"),  // address of class name string
  232.                     &wcProjectDetailView)           // address of structure for class data
  233.       ) {
  234.     return TRUE;
  235.   }
  236.  
  237.   // Ensure that the common control DLL is loaded.
  238.   InitCommonControls();
  239.  
  240.  
  241.   /* Fill in window class structure with parameters that describe the      */
  242.   /* main window.                                                          */
  243.  
  244.   wcProjectDetailView.style = 0;                     
  245.   wcProjectDetailView.lpfnWndProc = (WNDPROC)ProjectDetailViewWndProc; 
  246.   wcProjectDetailView.cbClsExtra = 0;             
  247.   wcProjectDetailView.cbWndExtra = 0;             
  248.   wcProjectDetailView.hInstance = hInstance;
  249.   wcProjectDetailView.hIcon = NULL;
  250.   wcProjectDetailView.hCursor = LoadCursor(NULL, IDC_ARROW);
  251.   wcProjectDetailView.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  252.   wcProjectDetailView.lpszMenuName =  NULL; 
  253.   wcProjectDetailView.lpszClassName = TEXT("ProjectDetailViewWClass");
  254.  
  255.   return (RegisterClass(&wcProjectDetailView));
  256. }
  257.  
  258. /****************************************************************************
  259. *
  260. *   FUNCTION: CreateProjectDetailWindow(HINSTANCE hInstance, HWND hwndParent)
  261. *
  262. *   PURPOSE:  Creates a ProjectDetailView window
  263. *
  264. ****************************************************************************/
  265.  
  266. HWND CreateProjectDetailWindow(HINSTANCE hInstance, HWND hwndParent) {
  267.  
  268.   RegisterProjectDetailViewClass(hInstance);
  269.   return CreateWindow(
  270.                   TEXT("ProjectDetailViewWClass"),
  271.                   TEXT(""),
  272.                   WS_CHILD|WS_VISIBLE,
  273.                   CW_USEDEFAULT,
  274.                   CW_USEDEFAULT,
  275.                   CW_USEDEFAULT,
  276.                   CW_USEDEFAULT,
  277.                   hwndParent,
  278.                   NULL,
  279.                   hInstance,
  280.                   NULL);
  281. };
  282. 
  283.